home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Internet Strate…Tools for the Enterprise / Microsoft Internet Strategy & Tools for the Enterprise.iso / content / devel.tls / icp / ftpexpl.exe / EXP_FCNS.BAS < prev    next >
BASIC Source File  |  1996-03-09  |  64KB  |  1,105 lines

  1. Attribute VB_Name = "Explorer_fcns"
  2. Option Explicit
  3.  
  4. '------------------------------------------------------------
  5. Sub FillClipBoard(FileList As ListView, ClipBoard() As String)
  6. '------------------------------------------------------------
  7.     Dim sItem As ListItem
  8.     Dim i As Long
  9. '------------------------------------------------------------
  10.     i = 0                                           ' Init Array Counter
  11.     
  12.     For Each sItem In FileList.ListItems            ' Search FileList Fast...
  13.         If sItem.Selected Then                      ' Is Item Selected
  14.             ReDim Preserve ClipBoard(i)             ' Resize ClipBoard Array
  15.             ClipBoard(i) = sItem.Key                ' Copy Selected Object
  16.             i = i + 1                               ' Increment Array Counter...
  17.         End If
  18.     Next                                            ' Next Item In List
  19. '------------------------------------------------------------
  20. End Sub
  21. '------------------------------------------------------------
  22.  
  23. Sub GetXYFromTag(sTag As String, x As Single, y As Single)
  24.     Dim pos As Integer
  25.     pos = InStr(1, sTag, ",")                       ' Search For Comma Sepparator
  26.     
  27.     If pos > 0 Then                                 ' If Comma found
  28.         x = CLng(Mid(sTag, 1, pos - 1))             ' Extract X position
  29.         y = CLng(Mid(sTag, pos + 1))                ' Extract y position
  30.     End If
  31. End Sub
  32.  
  33. '------------------------------------------------------------
  34. Function RenameKey(cNode As Object, NewKey As String) As Boolean
  35. ' Renames cNode's Existing Key To NewKey
  36. '------------------------------------------------------------
  37.     Dim cKey As String                              ' Current Node Key
  38. '------------------------------------------------------------
  39.     RenameKey = False                               ' Set Default Return Code
  40.     On Error GoTo ErrorHandler                      ' Enable Error Handling
  41.     
  42.     cNode.Key = NewKey                              ' Rename Key
  43.     
  44.     RenameKey = True                                ' Return Success
  45.     Exit Function                                   ' Exit
  46. '------------------------------------------------------------
  47. ErrorHandler:                                       ' Error Handler
  48. '------------------------------------------------------------
  49.     Debug.Print Err.Number, Err.Description         ' Debug Error
  50.     Exit Function                                   ' Return Error
  51. '------------------------------------------------------------
  52. End Function
  53. '------------------------------------------------------------
  54.  
  55. '------------------------------------------------------------
  56. Function vRenameFile(cItem As Object, NewName As String, FTP As Variant, CallBack As Variant, Refresh As Boolean) As Boolean
  57. ' Renames CurFileName in an existing directory to NewName
  58. '------------------------------------------------------------
  59.     Dim ItemType As String                          ' Current Item/File Type
  60.     Dim Prefix As String                            ' Key Prefix...
  61.     Dim OldKey As String                            ' Save cItem's Current Key Value
  62.     Dim NewKey As String                            ' cItem's New Key Value
  63.     Dim CurFile As String                           ' Current File
  64.     Dim CurPath As String                           ' Current Path
  65.     Dim i As Long                                   ' Loop Counter
  66.     Dim rc As Long                                  ' Function Return Code
  67.     Dim ePath As Long                               ' End Of Path String Position
  68.     Dim FTPIdx As Long                              ' FTP Control Index
  69. '------------------------------------------------------------
  70.     vRenameFile = False                             ' Set Default Return Code.
  71.     On Error GoTo vRenameError                      ' Enable Error Handling
  72.     OldKey = cItem.Key                              ' Save cItem's Key
  73.     
  74.     ItemType = ExtractPartFromNode(cItem, NODETYPEID)   ' Get Node Type
  75.     FTPIdx = CLng(ExtractPartFromNode(cItem, CTLINDEX)) ' Extract FTP Control Index ID...
  76.     CurFile = ExtractPartFromNode(cItem, FULLNAME)      ' Extract Full File Name
  77.     CurPath = ExtractPartFromNode(cItem, PATHNAME)      ' Extract Path Name
  78.     Prefix = ExtractPartFromNode(cItem, FULLPREFIX)     ' Extract Full Prefix
  79.     
  80.     NewKey = Prefix & CurPath & NewName                 ' Create New Key Name
  81.     If Not RenameKey(cItem, NewKey) Then GoTo vRenameError ' Handle Error
  82.     Screen.MousePointer = vbHourglass                   ' Show HourGlass
  83.  
  84.     '------------------------------------------------------------
  85.     Select Case ItemType                            ' Determine File Type
  86.     '------------------------------------------------------------
  87.     Case ftMCFILE, ftNWFILE, dtMCDIR, dtNWDIR       ' My Computer & Network UNC Files & Dirs
  88.     '------------------------------------------------------------
  89.         Name CurFile As CurPath & NewName           ' Rename File...
  90.     '------------------------------------------------------------
  91.     Case ftINFILE, dtINDIR                          ' FTP Internet File
  92.     '------------------------------------------------------------
  93.         CallBack(FTPIdx) = FTPRENAMEFILE            ' Set Connection CallBack Flag
  94.         
  95.         ' Rename File From CurFile To NewName...
  96.         rc = FTP(FTPIdx).RenameFile(CurFile, CurPath & NewName)
  97.     
  98.         Do While (CallBack(FTPIdx) = FTPRENAMEFILE) ' Wait For Connection Response
  99.             DoEvents                                ' Jump Up And Down On The Message Queue
  100.         Loop                                        ' Check Status Of Control
  101.         
  102.         If (CallBack(FTPIdx) = FTPERROR) Then GoTo vRenameError ' Handle Error
  103.     '------------------------------------------------------------
  104.     Case Else                                       ' Type Not Supported
  105.     '------------------------------------------------------------
  106.         GoTo vRenameError                           ' Handle Error
  107.     '------------------------------------------------------------
  108.     End Select
  109.     '------------------------------------------------------------
  110.     
  111.     ' Set Refresh Flag = True If Item Type Was A Directory
  112.     Refresh = ((ItemType = dtMCDIR) Or (ItemType = dtNWDIR) Or (ItemType = dtINDIR))
  113.     
  114.     Screen.MousePointer = vbDefault                 ' Reset Mouse Pointer
  115.     vRenameFile = True                              ' Return Success
  116.     Exit Function                                   ' Exit With Error...
  117. '------------------------------------------------------------
  118. vRenameError:                                       ' Handle Error
  119. '------------------------------------------------------------
  120.     Debug.Print Err.Number, Err.Description         ' Debug Error
  121.     Screen.MousePointer = vbDefault                 ' Reset Mouse Pointer
  122.     
  123.     If (cItem.Key <> OldKey) Then                   ' Has cNode's Key Changed?
  124.         cItem.Key = OldKey                          ' Restore cNode's Key
  125.     End If
  126.     
  127.     Exit Function                                   ' Exit
  128. '------------------------------------------------------------
  129. End Function
  130. '------------------------------------------------------------
  131.  
  132. '------------------------------------------------------------
  133. Function ExtractPartFromNode(NodeX As Object, PartType As Integer) As String
  134. '------------------------------------------------------------
  135.     Dim i As Long                                   ' Loop Index
  136.     Dim NodeType As String                          ' Node Type
  137.     Dim FullFileName As String                      ' File & Path Name
  138.     Dim Tok As String * 1                           ' Path Separator Token
  139.     Dim pos As Long                                 ' Position Of FileName
  140. '------------------------------------------------------------
  141.     ExtractPartFromNode = ""                        ' Set Default Return Code
  142.     
  143.     Select Case PartType
  144.     Case PARENTFORMID                                               ' Form Id
  145.         ExtractPartFromNode = Mid(NodeX.Key, 1, NODEFORMIDLEN)      ' Extract Parent Form Id
  146.     Case NODETYPEID                                                 ' Node Type
  147.         ExtractPartFromNode = Mid(NodeX.Key, (NODEFORMIDLEN + 1), NODEIDLEN) ' Extract NodeType Id
  148.     Case CTLINDEX                                                   ' FTP Control Index
  149.         ExtractPartFromNode = Mid(NodeX.Key, (NODEPREFIXLEN + 1), NODEFTPIDXLEN) ' Extract FTP Control Index
  150.     Case FULLPREFIX                                                 ' Full Prefix
  151.         ExtractPartFromNode = Mid(NodeX.Key, 1, (NODEPREFIXLEN + NODEFTPIDXLEN)) ' Extract Full Prefix
  152.     Case FULLNAME                                                   ' Extract Full Path\File Name
  153.         ExtractPartFromNode = Mid(NodeX.Key, (NODEPREFIXLEN + NODEFTPIDXLEN + 1)) ' Extract Full File & Path Name
  154.     Case liFILENAME, PATHNAME                                         ' Extract FileName or Extract Path Only
  155.         NodeType = Mid(NodeX.Key, (NODEFORMIDLEN + 1), NODEIDLEN)   ' Extract NodeType Id
  156.         FullFileName = Mid(NodeX.Key, (NODEPREFIXLEN + NODEFTPIDXLEN + 1)) ' Extract Full File & Path Name
  157.         
  158.         If ((NodeType = ftINFILE) Or (NodeType = dtINDIR)) Then ' Internet File or Path
  159.             Tok = "/"                                   ' Internet Path Token
  160.         Else
  161.             Tok = "\"                                   ' Internet Path Token
  162.         End If
  163.         
  164.         For i = (Len(FullFileName) - 1) To 1 Step -1    ' Step Backwards Through File Name
  165.             If Mid(FullFileName, i, 1) = Tok Then       ' Is Token Found
  166.                 If (PartType = liFILENAME) Then           ' If Extracting File Name
  167.                     ExtractPartFromNode = Mid(FullFileName, (i + 1)) ' Return File Name
  168.                     Exit For                            ' Exit Loop
  169.                 ElseIf (PartType = PATHNAME) Then       ' If Extracting File Path
  170.                     ExtractPartFromNode = Mid(FullFileName, 1, i) ' Return File Path
  171.                     Exit For                            ' Exit Loop
  172.                 End If
  173.             End If
  174.         Next                                            ' Get Next Charicter
  175.     End Select
  176. '------------------------------------------------------------
  177. End Function
  178. '------------------------------------------------------------
  179.  
  180. '------------------------------------------------------------
  181. Function ExtractPartFromStr(NodeX As String, PartType As Integer) As String
  182. '------------------------------------------------------------
  183.     Dim i As Long                                   ' Loop Index
  184.     Dim NodeType As String                          ' Node Type
  185.     Dim FullFileName As String                      ' File & Path Name
  186.     Dim Tok As String * 1                           ' Path Separator Token
  187.     Dim pos As Long                                 ' Position Of FileName
  188. '------------------------------------------------------------
  189.     ExtractPartFromStr = ""                        ' Set Default Return Code
  190.     
  191.     Select Case PartType
  192.     Case PARENTFORMID                                                       ' Form Id
  193.         ExtractPartFromStr = Mid(NodeX, 1, NODEFORMIDLEN)                   ' Extract Parent Form Id
  194.     Case NODETYPEID                                                         ' Node Type
  195.         ExtractPartFromStr = Mid(NodeX, (NODEFORMIDLEN + 1), NODEIDLEN)     ' Extract NodeType Id
  196.     Case CTLINDEX                                                           ' FTP Control Index
  197.         ExtractPartFromStr = Mid(NodeX, (NODEPREFIXLEN + 1), NODEFTPIDXLEN) ' Extract FTP Control Index
  198.     Case FULLPREFIX                                                         ' Full Prefix
  199.         ExtractPartFromStr = Mid(NodeX, 1, (NODEPREFIXLEN + NODEFTPIDXLEN)) ' Extract Full Prefix
  200.     Case FULLNAME                                                           ' Extract Full Path\File Name
  201.         ExtractPartFromStr = Mid(NodeX, (NODEPREFIXLEN + NODEFTPIDXLEN + 1)) ' Extract Full File & Path Name
  202.     Case liFILENAME, PATHNAME                                                 ' Extract FileName or Extract Path Only
  203.         NodeType = Mid(NodeX, (NODEFORMIDLEN + 1), NODEIDLEN)               ' Extract NodeType Id
  204.         FullFileName = Mid(NodeX, (NODEPREFIXLEN + NODEFTPIDXLEN + 1))      ' Extract Full File & Path Name
  205.         
  206.         If ((NodeType = ftINFILE) Or (NodeType = dtINDIR)) Then             ' Internet File or Path
  207.             Tok = "/"                                   ' Internet Path Token
  208.         Else
  209.             Tok = "\"                                   ' Internet Path Token
  210.         End If
  211.         
  212.         For i = (Len(FullFileName) - 1) To 1 Step -1    ' Step Backwards Through File Name
  213.             If Mid(FullFileName, i, 1) = Tok Then       ' Is Token Found
  214.                 If (PartType = liFILENAME) Then           ' If Extracting File Name
  215.                     ExtractPartFromStr = Mid(FullFileName, (i + 1)) ' Return File Name
  216.                     Exit For                            ' Exit Loop
  217.                 ElseIf (PartType = PATHNAME) Then       ' If Extracting File Path
  218.                     ExtractPartFromStr = Mid(FullFileName, 1, i)    ' Return File Path
  219.                     Exit For                            ' Exit Loop
  220.                 End If
  221.             End If
  222.         Next                                            ' Get Next Charicter
  223.     End Select
  224. '------------------------------------------------------------
  225. End Function
  226. '------------------------------------------------------------
  227.  
  228. '------------------------------------------------------------
  229. Function vCopyFile(sNode As String, dNode As String, FTP As Variant, CallBack() As Integer) As Boolean
  230. '------------------------------------------------------------
  231.     Dim sType As String                             ' Source Node File Type
  232.     Dim dType As String                             ' Destination Node File Type
  233.     Dim sName As String                             ' Source Full File Name
  234.     Dim dName As String                             ' Destination Full File Name
  235.     Dim sFTPIdx As Long                             ' Source FTP Control Index
  236.     Dim dFTPIdx As Long                             ' Dest FTP Control Index
  237.     Dim sFilePath As String                         ' Source File Path(Only)
  238.     Dim dFilePath As String                         ' Destination File Path(Only)
  239.     Dim sFileName As String                         ' Source File Name(Only)
  240.     Dim dFileName As String                         ' Destination File Name(Only)
  241.     Dim TempPath As String                          ' Environment Temp Path
  242.     Dim rc As Long                                  ' Function Return Code
  243. '------------------------------------------------------------
  244.     On Error GoTo vCopyError                        ' Enable Error Handling
  245.     vCopyFile = False                               ' Set Default Return Code.
  246.         
  247.     sType = ExtractPartFromStr(sNode, NODETYPEID)  ' Get Source Node Type
  248.     dType = ExtractPartFromStr(dNode, NODETYPEID)  ' Get Destination Node Type
  249.     sFTPIdx = CLng(ExtractPartFromStr(sNode, CTLINDEX)) ' Get FTP Control Index From Source
  250.     dFTPIdx = CLng(ExtractPartFromStr(dNode, CTLINDEX)) ' Get FTP Control Index From Dest
  251.     sFileName = ExtractPartFromStr(sNode, liFILENAME) ' Get File Name
  252.     sFilePath = ExtractPartFromStr(sNode, PATHNAME) ' Get Path Only
  253.     
  254.     Select Case dType
  255.     Case ntMCRCHILD, ntNWRCHILD, ntMCCHILD, _
  256.          ntNWCHILD, dtMCDIR, dtNWDIR                ' Dest Node Is A Directory, Use Full Name
  257.         dFilePath = ExtractPartFromStr(dNode, FULLNAME) & "\"
  258.     Case ntINRCHILD, ntINCHILD, dtINDIR
  259.         dFilePath = ExtractPartFromStr(dNode, FULLNAME) & "/"
  260.     Case ftMCFILE, ftNWFILE, ftINFILE               ' Dest Node Is A File, Use Path Only
  261.         dFilePath = ExtractPartFromStr(dNode, PATHNAME)
  262.     Case Else                                       ' Invalid Node Type...
  263.         GoTo vCopyError                             ' Enable Error Handling
  264.     End Select
  265.     
  266.     '------------------------------------------------------------
  267.     Select Case sType & dType
  268.     ' Determine Copy Type (Source) ==> (Dest)
  269.     '------------------------------------------------------------
  270.     Case ftMCFILE & ftMCFILE, ftMCFILE & dtMCDIR, _
  271.          ftMCFILE & ftNWFILE, ftMCFILE & dtNWDIR, _
  272.          ftNWFILE & ftMCFILE, ftNWFILE & dtMCDIR, _
  273.          ftNWFILE & ftNWFILE, ftNWFILE & dtNWDIR
  274.     ' [PC => PC] - VB FileCopy
  275.     '------------------------------------------------------------
  276.         ' Copy File...
  277.         FileCopy sFilePath & sFileName, dFilePath & sFileName
  278.     '------------------------------------------------------------
  279.     Case ftINFILE & ftMCFILE, ftINFILE & dtMCDIR, _
  280.          ftINFILE & ftNWFILE, ftINFILE & dtNWDIR
  281.     ' [FTP => PC] - FTP GetFile
  282.     '------------------------------------------------------------
  283.         ' GetFile - Copy File From Server...
  284.         rc = FFtpGetFile(sFilePath & sFileName, _
  285.                         dFilePath & sFileName, _
  286.                         FTP(sFTPIdx), CallBack(sFTPIdx))
  287.         
  288.         If Not rc Then GoTo vCopyError                          ' Handle Error
  289.     '------------------------------------------------------------
  290.     Case ftMCFILE & ftINFILE, ftMCFILE & dtINDIR, _
  291.          ftNWFILE & ftINFILE, ftNWFILE & dtINDIR
  292.     ' [PC => FTP] - FTP PutFile
  293.     '------------------------------------------------------------
  294.         ' PutFile - Copy File To Server...
  295.         rc = FFtpPutFile(sFilePath & sFileName, _
  296.                          dFilePath & sFileName, _
  297.                          FTP(dFTPIdx), CallBack(dFTPIdx))
  298.         
  299.         If Not rc Then GoTo vCopyError                      ' Handle Error
  300.     '------------------------------------------------------------
  301.     Case ftINFILE & ftINFILE, ftINFILE & dtINDIR
  302.     ' [FTP => FTP] - FTP GetFile & PutFile
  303.     '------------------------------------------------------------
  304.         TempPath = Space(255)                               ' Initialize TempPath Variable...
  305.         Call GetTempPath(255, TempPath)                     ' Get Temporary Path
  306.         TempPath = Trim(TempPath)                           ' Trim Var
  307.         If (Mid(TempPath, Len(TempPath), 1) = vbNullChar) Then TempPath = Mid(TempPath, 1, Len(TempPath) - 1)
  308.         If (TempPath = "") Then TempPath = App.Path & "\"   ' If TempPath Invalid The Use Working Directory
  309.         
  310.         '------------------------------------------------------------
  311.         ' Copy File From FTP Server(src) To Temp Directory
  312.         '------------------------------------------------------------
  313.         rc = FFtpGetFile(sFilePath & sFileName, _
  314.                          TempPath & sFileName, _
  315.                          FTP(sFTPIdx), CallBack(sFTPIdx))   ' GetFile - Copy File From Server...
  316.         
  317.         If Not rc Then GoTo vCopyError                      ' Handle Error
  318.         '------------------------------------------------------------
  319.         ' Copy File From Temp Directory To FTP Server(dest)
  320.         '------------------------------------------------------------
  321.         rc = FFtpPutFile(TempPath & sFileName, _
  322.                          dFilePath & sFileName, _
  323.                          FTP(dFTPIdx), CallBack(dFTPIdx))   ' PutFile - Copy File To Server...
  324.         
  325.         Kill TempPath & sFileName                           ' Delete Temp File
  326.         
  327.         If Not rc Then GoTo vCopyError              ' Handle Error
  328.     '------------------------------------------------------------
  329.     End Select
  330.     '------------------------------------------------------------
  331.     
  332.     vCopyFile = True                                ' Return Success
  333.     Exit Function                                   ' Exit
  334. '------------------------------------------------------------
  335. vCopyError:                                         ' Handle Errors
  336. '------------------------------------------------------------
  337.     Debug.Print Err.Number, Err.Description         ' Debug Error...
  338. '------------------------------------------------------------
  339. End Function
  340. '------------------------------------------------------------
  341.  
  342. '------------------------------------------------------------
  343. Function FFtpGetFile(src As String, dest As String, FTP As FTPCT, CallBack As Integer) As Boolean
  344. '------------------------------------------------------------
  345.     Dim rc As Long                              ' Function Return Code
  346. '------------------------------------------------------------
  347.     On Error GoTo 0
  348.     Screen.MousePointer = vbHourglass           ' Set Mouse Pointer
  349.     CallBack = FTPGETFILE                       ' Set CallBack Flag
  350.     
  351. '   FTP.DocOutput.filename = dest
  352.     Call FTP.GetFile(src, dest)                 ' GetFile - Copy File From Server...
  353.  
  354.     Do While (CallBack = FTPGETFILE)            ' Wait For File Copy Complete
  355.         DoEvents                                ' Jump Up And Down On The Message Queue
  356.     Loop                                        ' Continue Checking Status
  357.     
  358.     Screen.MousePointer = vbDefault             ' Reset Mouse Pointer
  359.     FFtpGetFile = (CallBack = FTPSUCCESS)       ' Return True If File Copy Successful
  360. '------------------------------------------------------------
  361. End Function
  362. '------------------------------------------------------------
  363.  
  364. '------------------------------------------------------------
  365. Function FFtpPutFile(src As String, dest As String, FTP As FTPCT, CallBack As Integer) As Boolean
  366. '------------------------------------------------------------
  367.     Dim rc As Long                              ' Function Return Code
  368. '------------------------------------------------------------
  369.     Screen.MousePointer = vbHourglass           ' Set Mouse Pointer
  370.     CallBack = FTPPUTFILE                       ' Set CallBack Flag
  371.     
  372. '   FTP.DocInput.filename = src
  373.     Call FTP.PutFile(src, dest)                 ' FTP Put File - Copy File To Server...
  374.  
  375.     Do While (CallBack = FTPPUTFILE)            ' Wait For File Copy Complete
  376.         DoEvents                                ' Jump Up And Down On The Message Queue
  377.     Loop                                        ' Continue Checking Status
  378.     
  379.     Screen.MousePointer = vbDefault             ' Reset Mouse Pointer
  380.     FFtpPutFile = (CallBack = FTPSUCCESS)        ' Return True If File Copy Successful
  381. '------------------------------------------------------------
  382. End Function
  383. '------------------------------------------------------------
  384.  
  385. '------------------------------------------------------------
  386. Function vDeleteFile(cItem As ListItem, FTP As Variant) As Boolean
  387. ' Deletes The Current File Associated With cItem
  388. '------------------------------------------------------------
  389.     Dim ItemType As String                          ' Current Item/File Type
  390.     Dim CurFile As String                           ' Current File
  391.     Dim rc As Long                                  ' Function Return Code
  392.     Dim FTPIdx As Long                              ' FTP Control Index
  393. '------------------------------------------------------------
  394.     On Error GoTo vDeleteError                      ' Enable Error Handling
  395.     vDeleteFile = False                             ' Set Default Return Code.
  396.     
  397.     ItemType = Mid(cItem.Key, (NODEFORMIDLEN + 1), NODEIDLEN) ' Extract Node Type...
  398.     
  399.     '------------------------------------------------------------
  400.     ' Confirm Delete
  401.     '------------------------------------------------------------
  402.     Select Case ItemType
  403.     Case ftMCFILE, ftNWFILE, ftINFILE
  404.         rc = MsgBox("Are you sure you want to delete '" & cItem & "'?", _
  405.                     vbInformation + vbYesNo, "Confirm File Delete")
  406.     Case dtMCDIR, dtNWDIR, dtINDIR
  407.         rc = MsgBox("Are you sure you want to remove the folder '" & cItem & _
  408.                      "' and all of its contents?", vbInformation + vbYesNo, _
  409.                      "Confirm Folder Delete")
  410.     End Select
  411.     If (rc <> vbYes) Then Exit Function             ' User Changed There Mind.
  412.     
  413.     '------------------------------------------------------------
  414.     ' Delete File/Directories
  415.     '------------------------------------------------------------
  416.     ' Extract Full File Name
  417.     CurFile = Mid(cItem.Key, (NODEPREFIXLEN + NODEFTPIDXLEN + 1))
  418.         
  419.     ' Extract FTP Control Index Value
  420.     FTPIdx = CLng(Mid(cItem.Key, (NODEPREFIXLEN + 1), NODEFTPIDXLEN))
  421.     
  422.     Select Case ItemType                            ' Determine File Type
  423.     Case ftMCFILE, ftNWFILE                         ' My Computer & Network UNC Files
  424.         Kill CurFile                                ' Delete File...
  425.     Case dtMCDIR, dtNWDIR                           ' My Computer & Network UNC Dirs
  426.         '<<< Need To Make This More Robust >>>'
  427.         Kill CurFile & "\*.*"                       ' Delete All Files...
  428.         RmDir CurFile                               ' Remove Directory
  429.     Case ftINFILE                                   ' FTP Internet File
  430.         rc = FTP(FTPIdx).DeleteFile(CurFile)        ' Delete Current File
  431.         '<<< Need To Make This More Robust >>>'
  432.         ' Validate Delete
  433.     Case dtINDIR                                    ' FTP Internet Directory
  434.         rc = FTP(FTPIdx).DeleteFile(CurFile)        ' Delete Current File
  435.         '<<< Need To Make This More Robust >>>'
  436.         ' Validate Delete
  437.     Case Else                                       ' Type Not Supported
  438.         Exit Function                               ' Exit With Error...
  439.     End Select
  440.     '------------------------------------------------------------
  441.         
  442. '   cItem.Remove                                    ' Kill Node Key
  443.     vDeleteFile = True                              ' Return Success
  444.     Exit Function                                   ' Exit With Error...
  445. '------------------------------------------------------------
  446. vDeleteError:                                       ' Handle Error
  447. '------------------------------------------------------------
  448.     Debug.Print Err.Number, Err.Description         ' Debug Error
  449.     Exit Function                                   ' Exit
  450. '------------------------------------------------------------
  451. End Function
  452. '------------------------------------------------------------
  453.  
  454. '------------------------------------------------------------
  455. Sub LoadLocalDrives(TV As TreeView, ParentNode As Node)
  456. '------------------------------------------------------------
  457.     Dim Drive As Long                               ' Drive ID
  458.     Dim sDrive As String * 1                        ' Drive Letter
  459.     Dim DriveType As Long                           ' Drive Type Icon Value
  460.     Dim FormID As String * NODEFORMIDLEN            ' Form ID String Value
  461.     Dim NewNode As String                           ' New Child Node ID
  462.     Dim rc As Long                                  ' Return Code Variable
  463. '------------------------------------------------------------
  464.     On Error Resume Next                            ' Resume If Key Already Exists...
  465.     FormID = Mid(TV.Nodes(1).Key, 1, NODEFORMIDLEN) ' Extract Form ID From First Tree Node...
  466.     
  467.     For Drive = Asc("A") To Asc("Z")                ' For Each Drive Letter
  468.         sDrive = Chr$(Drive)                        ' Convert Drive ID To String
  469.         NewNode = FormID & ntMCRCHILD & NULLIDX & sDrive & ":" ' Create NewNode Key
  470.         
  471.         If GetDriveInfo(sDrive, DriveType) Then     ' Get Drive Type Icon Value
  472.             Call TV.Nodes.Add(ParentNode, tvwChild, _
  473.                               NewNode, "(" & sDrive & ":" & ")", _
  474.                               DriveType)            ' Add Node To Tree...
  475.         Else
  476.             Call TV.Nodes.Remove(NewNode)           ' Otherwise Remove Node From TreeView...
  477.         End If
  478.     Next                                            ' Check Next Drive...
  479. '------------------------------------------------------------
  480. End Sub
  481. '------------------------------------------------------------
  482.  
  483. '------------------------------------------------------------
  484. Public Function GetDriveInfo(ByVal Drive As String, drvType As Long) As Boolean
  485. '------------------------------------------------------------
  486.     Dim sDrive As String
  487. '------------------------------------------------------------
  488.     GetDriveInfo = False                            ' Set Default Return Code
  489.     sDrive = Drive & ":\"
  490.     
  491.     Select Case GetDriveType(sDrive)
  492.     Case DRIVE_CDROM
  493.         drvType = TCDROMDRIVE
  494.     Case DRIVE_FIXED
  495.         drvType = THARDDRIVE
  496.     Case DRIVE_REMOTE
  497.         drvType = TNETDRIVE
  498.     Case DRIVE_RAMDISK
  499.         drvType = TRAMDRIVE
  500.     Case DRIVE_REMOVABLE
  501. '       drvType = TFLOPPY514
  502.         drvType = TFLOPPY35
  503.     Case Else
  504.         Exit Function
  505.     End Select
  506.     
  507.     GetDriveInfo = True                             ' Set Default Return Code
  508. '------------------------------------------------------------
  509. End Function
  510. '------------------------------------------------------------
  511.  
  512. '------------------------------------------------------------
  513. Sub GetDirs(Tree As TreeView, NodeX As Node, FTP As FTPCT, Refresh As Boolean)
  514. '------------------------------------------------------------
  515.     Dim NodeType As String                          ' Type Of Node Used...
  516.     Dim NodeKey As String                           ' Unique Key For New Tree Node...
  517.     Dim FormID As String                            ' Form Id
  518.     Dim RootDir As String                           ' Root Directory Of SubDirectory
  519.     Dim ChildDir As String                          ' New Child Directory
  520.     Dim FTPListRS As String                           ' Name List Results Set
  521.     Dim FTPItem As String                           ' FTP File Or Directory Detail Line
  522.     Dim FileInfo As FTPFileInfo                     ' Contains FTP File/Dir Information.
  523.     Dim Idx As String * NODEFTPIDXLEN               ' FTP Control Index
  524.     Dim eoLine As Long                              ' End Of Line
  525.     Dim Attr As Integer                             ' File Attributes Var...
  526. '------------------------------------------------------------
  527.     On Error GoTo CheckError                        ' Enable Error Handler
  528.     With Tree.Nodes                                 ' Shorten Ole Reference...
  529.     
  530.     If Refresh Then                                 ' Refresh Child Nodes...
  531.         Do While Not (NodeX.Child Is Nothing)       ' While Child Nodes Exist
  532.             .Remove NodeX.Child.Index               ' Remove Them...
  533.         Loop                                        ' Next Child
  534.     Else
  535.         If (NodeX.Children > 0) Then Exit Sub       ' If Children Exist Then Don't Redo
  536.     End If
  537.     
  538.     FormID = ExtractPartFromNode(NodeX, PARENTFORMID) ' Parent Form ID (i.e. Tag Value)
  539.     NodeType = ExtractPartFromNode(NodeX, NODETYPEID) ' Get Node Type
  540.     Idx = ExtractPartFromNode(NodeX, CTLINDEX)        ' Extract FTP Control Index ID...
  541.     RootDir = ExtractPartFromNode(NodeX, FULLNAME)    ' Extract Root Directory Path
  542.     
  543.     Select Case NodeType                            ' Build Unique Node ID Prefix
  544.     Case ntMCRCHILD, ntMCCHILD                      ' My Computer Children
  545.         NodeKey = FormID & ntMCCHILD & NULLIDX      ' Network UNC Child Node ID Prefix
  546.     Case ntNWRCHILD, ntNWCHILD                      ' Network Unc Children
  547.         NodeKey = FormID & ntNWCHILD & NULLIDX      ' My Computer Child Node ID Prefix
  548.     Case ntINRCHILD, ntINCHILD                      ' Internet FTP Children
  549.         NodeKey = FormID & ntINCHILD & Idx          ' Internet FTP Child Node ID Prefix
  550.     End Select
  551.     
  552.     Select Case NodeType                            ' Handle Each File System Type
  553.     '------------------------------------------------------------
  554.     Case ntMCRCHILD, ntMCCHILD, ntNWRCHILD, ntNWCHILD ' My Computer & Network Unc Files...
  555.     '------------------------------------------------------------
  556.         RootDir = RootDir & "\"                     ' Add Directory Separator
  557.         ChildDir = Dir$(RootDir, vbDirectory)       ' Start Search For Sub Directories
  558.             
  559.         Do While (ChildDir <> "")                   ' While More Directories
  560.             If ((ChildDir <> ".") And (ChildDir <> "..")) Then ' Ignore Current and Previous Directories...
  561.                 Attr = GetAttr(RootDir & ChildDir)      ' Extract Attributes...
  562.                 If (Attr = vbDirectory) Then            ' Is This A Directory...
  563.                     Call .Add(NodeX.Key, tvwChild, _
  564.                               NodeKey & RootDir & ChildDir, _
  565.                               ChildDir, TFOLDERCLOSED) ' Add New Directory Node To Tree.
  566.                 End If
  567.             End If
  568.             ChildDir = Dir$                         ' Get Next Directory
  569.         Loop                                        ' Loop For More Directories...
  570.         
  571.         Exit Sub                                    ' Exit
  572.     '------------------------------------------------------------
  573.     Case ntINRCHILD, ntINCHILD                      ' Internet FTP Children
  574.     '------------------------------------------------------------
  575.         RootDir = RootDir & "/"                     ' Add Directory Separator
  576.         FTPListRS = FTP.Tag                           ' Copy NameList() Results
  577.         If (UCase(Mid(FTPListRS, 1, 5)) = "TOTAL") Then ' Is First Line Invalid...
  578.             eoLine = InStr(1, FTPListRS, vbCrLf)      ' Calculate eoLine Position
  579.             FTPListRS = Mid(FTPListRS, eoLine + 2)      ' Remove First Line...
  580.         End If
  581.         
  582.         Do While (FTPListRS <> "")                    ' While More Items Exits In List...
  583.             eoLine = InStr(1, FTPListRS, vbCrLf)      ' Calculate eoLine Position
  584.             If (eoLine < 1) Then eoLine = Len(FTPListRS) ' Validate/Adjust eoLine
  585.             
  586.             FTPItem = Mid(FTPListRS, 1, eoLine - 1)   ' Get Next Line
  587.             If (FTPItem = "") Then Exit Do          ' Next Line Not Found
  588.             
  589.             Call ParseFTPFileInfo(FTPItem, FileInfo) ' Parse File Info...
  590.             
  591.             ' Is Current Item A Sub Directory Only...
  592.             Select Case FileInfo.fType
  593.             Case FTFOLDER
  594.                 If ((FileInfo.fName <> ".") And (FileInfo.fName <> "..")) Then
  595.                     Call .Add(NodeX.Key, tvwChild, _
  596.                          NodeKey & RootDir & FileInfo.fName, _
  597.                          FileInfo.fName, TFOLDERCLOSED) ' Add New Directory Node To Tree.
  598.                 End If
  599.             Case FTSHORTCUT
  600.                 Call .Add(NodeX.Key, tvwChild, _
  601.                      NodeKey & RootDir & FileInfo.fName, _
  602.                      FileInfo.fName, TSHORTCUTCLOSED) ' Add New Directory Node To Tree.
  603.             End Select
  604.             
  605.             FTPListRS = Mid(FTPListRS, eoLine + 2)      ' Remove Previous Item & vbCrLf Char
  606.         Loop                                        ' Process Next Item In List
  607.         
  608.         Exit Sub                                    ' Exit
  609.     '------------------------------------------------------------
  610.     End Select
  611.     End With ''' Tree.Nodes
  612. '------------------------------------------------------------
  613. CheckError:
  614. '------------------------------------------------------------
  615.     Debug.Print Err.Number, Err.Description                 ' Debug Error Messages...
  616.     Resume Next                                             ' Ignore Error And Resume..
  617. '------------------------------------------------------------
  618. End Sub
  619. '------------------------------------------------------------
  620.  
  621. '------------------------------------------------------------
  622. Sub ParseFTPFileInfo(SearchString As String, FileInfo As FTPFileInfo)
  623. '------------------------------------------------------------
  624.     Dim Line As String                              ' Copy Of Search String
  625.     ReDim plist(0) As String                        ' Parse List Array Of Items
  626.     Dim pos As Long                                 ' Position Of Next Space
  627.     Dim i As Long, j As Long                        ' Loop Array Variable
  628.     Dim dFields As Long                             ' Number Of Fields In A Date
  629.     Dim lBnd As Long, uBnd As Long                  ' Lower & Upper Bound of pList()
  630.     Dim sDate As String                             ' Date Text...
  631.     Dim char As String * 1                          ' Single Char Var...
  632. '------------------------------------------------------------
  633.     On Error GoTo ParseError                        ' Enable Error Handling...
  634.     
  635.     Line = Trim(SearchString)                       ' Make Copy Of SearchString, Buffer w/1 space
  636.  
  637.     '------------------------------------------------------------
  638.     ' Parse Line Into A List
  639.     '------------------------------------------------------------
  640.     Do While (Line <> "")                           ' While Line Is Not Empty
  641.         For j = 1 To Len(Line)                      ' For Each Char In Line
  642.             Select Case Mid(Line, j, 1)             ' Evaluate Next Char
  643.             Case " ", vbNullChar, vbCr, vbLf, vbBack, _
  644.                  vbTab, vbVerticalTab, vbFormFeed   ' Look For weird Char.s
  645.             Case Else                               ' Done Searching...
  646.                 If (j > 1) Then Line = Mid(Line, j) ' Extract Extra Char.s Out
  647.                 Exit For                            ' Exit For Loop
  648.             End Select
  649.         Next                                        ' Next Char =>
  650.         
  651.         pos = InStr(1, Line, " ") - 1               ' Get Position Of Next Space
  652.         If (pos < 1) Then pos = Len(Line)           ' Validate/Adjust Pos
  653.         
  654.         ReDim Preserve plist(i) As String           ' Expand pList Size...
  655.         plist(i) = Mid(Line, 1, pos)                ' Parse Next Item From Line
  656.         i = i + 1                                   ' Increment Counter
  657.         Line = LTrim(Mid(Line, pos + 2))            ' Cut All Preceding Spaces Only...
  658.     Loop                                            ' Continue Parsing Line
  659.     
  660.     lBnd = LBound(plist)                            ' Get Lower Bound Of pList
  661.     uBnd = UBound(plist)                            ' Get Upper Bound Of pList
  662.     
  663.     FileInfo.fDateTime = ""                         ' Clear DateTime Value...
  664.     FileInfo.fAccess = ""                           ' Clear Access Type
  665.     FileInfo.fSize = -1                             ' Init File Size
  666.     FileInfo.fName = plist(uBnd)                    ' AssUMe Name Is Last Entry
  667.     FileInfo.fType = FTFILE                         ' Set File Type As File(Default)
  668.  
  669.     '------------------------------------------------------------
  670.     ' Look For Unix Style Security Info...
  671.     '------------------------------------------------------------
  672.     char = Mid(plist(lBnd), 1, 1)
  673.     Select Case char
  674.     Case "d", "D"                                   ' Directory
  675.         FileInfo.fType = FTFOLDER
  676.     Case "l", "L"                                   ' ShortCut
  677.         FileInfo.fType = FTSHORTCUT
  678.     Case "-", "S", "T"                              ' Regular File
  679.         FileInfo.fType = FTFILE
  680.     Case "c", "C"                                   ' Charicter Device File
  681.         FileInfo.fType = FTCHARDEV
  682.     Case "b", "B"                                   ' Block Device File
  683.         FileInfo.fType = FTBLOCKDEV
  684.     Case "s"                                        ' Unix Domain Socket (BSD)
  685.         FileInfo.fType = FTUNIXDS
  686.     Case "p", "P"                                   ' Named Pipe (ATT)
  687.         FileInfo.fType = FTNAMEDPIPE
  688.     End Select
  689.     
  690.     Select Case char
  691.     Case "d", "l", "c", "b", "p", "s", "-", _
  692.          "D", "L", "C", "B", "P", "S", "T"
  693.         FileInfo.fAccess = plist(lBnd)              ' Copy Access Type
  694.     End Select
  695.     '------------------------------------------------------------
  696.     ' Evaluate Each Member In The List To Determine Its Content
  697.     '------------------------------------------------------------
  698.     For i = (uBnd - 1) To (lBnd + 1) Step -1        ' Evaluate Each Item From Right To Left
  699.         If (FileInfo.fDateTime = "") Then           ' Has A Date Been Found Yet?
  700.             If (i > lBnd) Then                      ' Are There >= 2 Items In List
  701.                 sDate = plist(i - 1) & " " & plist(i) ' Copy Date String
  702.                 If IsDate(sDate) Then dFields = 1   ' 2 Date Fields
  703.             ElseIf ((i - 1) > lBnd) Then            ' Are There >= 3 Items In List
  704.                 sDate = plist(i - 2) & " " & plist(i - 1) & " " & plist(i) ' Copy Date String
  705.                 If IsDate(sDate) Then dFields = 2   ' 3 Date Fields
  706.             End If
  707.         End If
  708.         
  709.         Select Case True                            ' Determine Information Type
  710.         Case (dFields > 0)                          ' Date Format Found
  711.             FileInfo.fDateTime = Format$(sDate, FMTDATETIME) ' Extract Date/Time
  712.             i = i - dFields                         ' Decrement Loop Counter By Num Of Date Fields
  713.             sDate = ""                              ' Clear Var...
  714.             dFields = 0                             ' Clear Var...
  715.         Case plist(i) = FTPDIR                      ' Microsoft FTP Directory Flag
  716.             FileInfo.fType = FTFOLDER               ' Set File Type As Directory
  717.         Case (IsNumeric(plist(i)) And (FileInfo.fSize = -1)) ' Numeric? and fSize Not Set Yet
  718.             FileInfo.fSize = plist(i)               ' Assume File Size...
  719.         Case plist(i) = FTPSHORTCUT                 ' ShortCut "->" Found
  720.             If (i > lBnd) Then                      ' Are There >= 2 Items In List
  721.                 FileInfo.fName = plist(i - 1)       ' Copy ShortCut Alias Name
  722.             End If
  723.         Case Else
  724.         End Select
  725.     Next                                            ' Next Argument...
  726.     Exit Sub                                        ' Exit
  727. '------------------------------------------------------------
  728. ParseError:                                         ' Handle Error
  729. '------------------------------------------------------------
  730.     Debug.Print Err.Number, Err.Description         ' Debug Error
  731.     Resume Next                                     ' Ignore Error And Resume
  732. '------------------------------------------------------------
  733. End Sub
  734. '------------------------------------------------------------
  735.  
  736. '------------------------------------------------------------
  737. Sub GetFiles(FileList As ListView, NodeX As Node, FTP As FTPCT)
  738. '------------------------------------------------------------
  739.     Dim FormID As String                            ' Parent Form ID
  740.     Dim NodeType As String                          ' Type Of Node Used...
  741.     Dim FilePath As String                          ' Current File Path
  742.     Dim cFileName As String                          ' Current File Or Dir Name
  743.     Dim FullFileName As String                      ' Full Path\File Name
  744.     Dim Row As ListItem                             ' Current ListView Row...
  745.     Dim fPfx As String                              ' File Prefix
  746.     Dim dPfx As String                              ' Directory Prefix
  747.     Dim FTPListRS As String                           ' Name List Results Set
  748.     Dim FTPItem As String                           ' FTP File Or Directory Detail Line
  749.     Dim FileInfo As FTPFileInfo                     ' Contains FTP File/Dir Information.
  750.     Dim Idx As String * NODEFTPIDXLEN               ' FTP Control Index
  751.     Dim eoLine As Long                              ' End Of Line Position
  752.     Dim IconIDX As Integer                          ' Icon Index...
  753.     Dim Attr As Integer                             ' File, Directory Attributes...
  754. '------------------------------------------------------------
  755.     On Error GoTo CheckError                        ' Handle Errors
  756.         
  757.     With FileList.ListItems                         ' Enable Early Binding...
  758.     FileList.Sorted = False
  759.     
  760.     FormID = Mid(NodeX.Key, 1, NODEFORMIDLEN)                       ' Get Parent Form ID
  761.     NodeType = Mid(NodeX.Key, (NODEFORMIDLEN + 1), NODEIDLEN)       ' Get Node Type
  762.     Idx = Mid(NodeX.Key, (NODEPREFIXLEN + 1), NODEFTPIDXLEN)        ' Extract FTP Control Index ID...
  763.     FilePath = Mid(NodeX.Key, (NODEPREFIXLEN + NODEFTPIDXLEN + 1))  ' Extract Root Directory Path
  764.     
  765.     Select Case NodeType
  766.     Case ntMCRCHILD, ntMCCHILD                      ' My Computer
  767.         fPfx = FormID & ftMCFILE & Idx              ' My Computer File Type
  768.         dPfx = FormID & dtMCDIR & Idx               ' My Computer Directory Type
  769.     Case ntNWRCHILD, ntNWCHILD                      ' Network Unc
  770.         fPfx = FormID & ftNWFILE & Idx              ' Network UNC File Type
  771.         dPfx = FormID & dtNWDIR & Idx               ' Network UNC Directory Type
  772.     Case ntINRCHILD, ntINCHILD                      ' Internet FTP
  773.         fPfx = FormID & ftINFILE & Idx              ' Internet FTP File Type
  774.         dPfx = FormID & dtINDIR & Idx               ' Internet FTP Directory Type
  775.     End Select
  776.     
  777.     '------------------------------------------------------------
  778.     Select Case NodeType                            ' Handle Each File System Type
  779.     '------------------------------------------------------------
  780.     ' My Computer & Network Unc Files...
  781.     Case ntMCRCHILD, ntMCCHILD, ntNWRCHILD, ntNWCHILD
  782.     '------------------------------------------------------------
  783.         cFileName = Dir(FilePath & "\", vbNormal + vbReadOnly + vbHidden + _
  784.                                        vbSystem + vbArchive + vbDirectory) ' Get First File Name
  785.         
  786.         Do While (cFileName <> "")                       ' While More Files Exist...
  787.             If ((cFileName <> ".") And (cFileName <> "..")) Then
  788.                 FullFileName = FilePath & "\" & cFileName ' Copy Full File Name
  789.                 
  790.                 Attr = GetAttr(FullFileName)            ' Get Files Attributes...
  791.                 If (Attr <> vbDirectory) Then
  792.                     ' Add File Name To ListView
  793.                     Set Row = .Add(, fPfx & FullFileName, cFileName, TFILE, TFILE)
  794.                     Row.SubItems(LVCOLFILETYPE) = FTFILE ' Add Type To ListView
  795.                 Else
  796.                     ' Add Directory Name To ListView
  797.                     Set Row = .Add(, dPfx & FullFileName, cFileName, TFOLDERCLOSED, TFOLDERCLOSED)
  798.                     Row.SubItems(LVCOLFILETYPE) = FTFOLDER ' Add Type To ListView
  799.                 End If
  800.                 
  801.                 ' Add File Size To ListView
  802.                 Row.SubItems(LVCOLFILESIZE) = Str$(FileLen(FullFileName) \ 1024) & "KB"
  803.                 
  804.                 ' Add File Date/Time To ListView
  805.                 Row.SubItems(LVCOLFILEDATE) = Format$(FileDateTime(FullFileName), FMTDATETIME)
  806.             End If
  807.             
  808.             cFileName = Dir                              ' Get Next File
  809.         Loop
  810.     '------------------------------------------------------------
  811.     Case ntINRCHILD, ntINCHILD                          ' Internet FTP File System
  812.     '------------------------------------------------------------
  813.         FTPListRS = FTP.Tag                               ' Copy NameList() Results
  814.         
  815.         If (UCase(Mid(FTPListRS, 1, 5)) = "TOTAL") Then   ' Is First Line Invalid...
  816.             eoLine = InStr(1, FTPListRS, vbCrLf)          ' Calculate eoLine Position
  817.             FTPListRS = Mid(FTPListRS, eoLine + 2)          ' Remove First Line...
  818.         End If
  819.         
  820.         Do While (FTPListRS <> "")                        ' While More Items Exits In List...
  821.             eoLine = InStr(1, FTPListRS, vbCrLf)          ' Calculate eoLine Position
  822.             If (eoLine < 1) Then eoLine = Len(FTPListRS)  ' Validate/Adjust eoLine
  823.             
  824.             FTPItem = Mid(FTPListRS, 1, eoLine - 1)       ' Get Next Line
  825.             If (FTPItem = "") Then Exit Do              ' Next Line Not Found
  826.  
  827.             Call ParseFTPFileInfo(FTPItem, FileInfo)    ' Parse File Info...
  828.             
  829.             If ((FileInfo.fName <> ".") And (FileInfo.fName <> "..")) Then ' If Not [.] or [..]
  830.                 FullFileName = FilePath & "/" & FileInfo.fName ' Create Full Path\File Name
  831.                     
  832.                 Select Case FileInfo.fType
  833.                 Case FTFOLDER                           ' Directory
  834.                     ' Add Directory Name To ListView
  835.                     Set Row = .Add(, dPfx & FullFileName, FileInfo.fName, TFOLDERCLOSED, TFOLDERCLOSED)
  836.                 Case FTSHORTCUT                         ' ShortCut
  837.                     ' Add ShortCut Directory Name To ListView
  838.                     Set Row = .Add(, dPfx & FullFileName, FileInfo.fName, TSHORTCUTCLOSED, TSHORTCUTCLOSED)
  839.                 Case FTFILE, FTCHARDEV, FTBLOCKDEV      ' File, Chr Device File, Block Device File
  840.                     ' Add File Name To ListView
  841.                     Set Row = .Add(, fPfx & FullFileName, FileInfo.fName, TFILE, TFILE)
  842.                 Case FTUNIXDS, FTNAMEDPIPE              ' Unix Domain Socket (BSD)
  843.                     ' Add ShortCute File Name To ListView
  844.                     Set Row = .Add(, fPfx & FullFileName, FileInfo.fName, TSHORTCUTFILE, TSHORTCUTFILE)
  845.                 End Select
  846.                 
  847.                 ' Add Type To ListView
  848.                 Row.SubItems(LVCOLFILETYPE) = FileInfo.fType
  849.                 
  850.                 ' Add File Size To ListView
  851.                 Row.SubItems(LVCOLFILESIZE) = Str$(CLng(FileInfo.fSize) \ 1024) & "KB"
  852.                  
  853.                  ' Add File Date/Time To ListView
  854.                 Row.SubItems(LVCOLFILEDATE) = FileInfo.fDateTime
  855.                 
  856.                 ' Add Access Rights To ListView
  857.                 Row.SubItems(LVCOLFILEACCESS) = FileInfo.fAccess
  858.             End If
  859.             
  860.             FTPListRS = Mid(FTPListRS, eoLine + 2)          ' Remove Previous Item & vbCrLf Char
  861.         Loop                                            ' Process Next Item In List
  862.         
  863.         Exit Sub                                        ' Exit
  864.     '------------------------------------------------------------
  865.     End Select
  866.     '------------------------------------------------------------
  867.     
  868.     FileList.Sorted = True
  869.     End With ''' FileList.ListItems
  870.     Exit Sub                                            ' Exit
  871. '------------------------------------------------------------
  872. CheckError:                                             ' Error Handler
  873. '------------------------------------------------------------
  874.     Debug.Print FullFileName, Err.Number, Err.Description             ' Debug Error
  875.     Resume Next                                         ' Ignore Error And Resume
  876. '------------------------------------------------------------
  877. End Sub
  878. '------------------------------------------------------------
  879.  
  880. Public Sub AddFTPConnection(FTP As FTPCT, Tree As TreeView, Frm As Form)
  881. '------------------------------------------------------------
  882.     Dim rc As Long                                  ' Return Code
  883.     Dim nChild As Node                              ' Current Child Node
  884. '------------------------------------------------------------
  885.     On Error GoTo CleanUp                           ' Enable Error Handling
  886.     
  887.     Load FTPConnect                                 ' Load FTPConnect Form
  888.     FTPConnect.Show vbModal                         ' Show UNCRemove Form
  889.     
  890.     If (FTPConnect.txtRemoteHost.Text <> "") Then   ' If ServerName Exits Then Process...
  891.         Screen.MousePointer = vbHourglass           ' Show HourGlass
  892.         
  893.         FTP.Connect FTPConnect.txtRemoteHost.Text   ' Connect To FTP Server
  894.         
  895.         Do While (FTP.State = prcConnecting) Or _
  896.                  (FTP.State = prcResolvingHost) Or _
  897.                  (FTP.State = prcHostResolved)      ' Wait For Connection Response
  898.             DoEvents                                ' Jump Up And Down On The Message Queue
  899.         Loop                                        ' Check Status Of Control
  900.         
  901.         If (FTP.State <> prcConnected) Then         ' Did An Error Occure...
  902.             Unload FTP                              ' Delete Control Instance...
  903.             GoTo CleanUp
  904.         End If
  905.         
  906.         FTP.UserId = FTPConnect.txtUserName.Text
  907.         FTP.Password = FTPConnect.txtPassword.Text
  908.         Do While (FTP.State = prcConnected) And _
  909.                  (FTP.ProtocolState = ftpBase)      ' Wait For Connection Response
  910.             DoEvents                                ' Jump Up And Down On The Message Queue
  911.         Loop                                        ' Check Status Of Control
  912.         FTP.Authenticate
  913.         
  914.         Call Tree.Nodes.Add(Frm.Tag & ntINTERNET & NULLIDX & NTRINTERNET, tvwChild, _
  915.                             Frm.Tag & ntINRCHILD & Format$(FTP.Index, FMTINDEX) & FTPROOTDIR, _
  916.                             FTP.RemoteHost, TMYCOMPUTER) ' Add Node To Tree...
  917.  
  918.         Screen.MousePointer = vbDefault             ' Reset Mouse Pointer
  919.     Else                                            ' Connect Was Canceled
  920.         Unload FTP                                  ' Delete Control Instance...
  921.     End If
  922. '------------------------------------------------------------
  923. CleanUp:                                            ' Clean Up Environment...
  924. '------------------------------------------------------------
  925.     Unload FTPConnect                               ' Close FTPConnect Form
  926.     Screen.MousePointer = vbDefault             ' Reset Mouse Pointer
  927. '   Resume Next
  928. '------------------------------------------------------------
  929. End Sub
  930.  
  931. '------------------------------------------------------------
  932. Public Sub RemoveUNCPath(TV As TreeView, UNCNode As Node)
  933. ' Removes UNC Path From TreeView Control
  934. '------------------------------------------------------------
  935.     Dim i As Integer                                ' Index Pointer
  936.     Dim nChild As Node                              ' Current Child Node
  937. '------------------------------------------------------------
  938.     On Error GoTo CleanUp                           ' Enable Error Handling
  939.     
  940.     Load UNCRemove                                  ' Load UNCRemove Form
  941.     UNCRemove.Caption = "Disconnect Network Path"   ' Set Network Path Title
  942.     UNCRemove.lbList.Caption = "&Path"              ' Set List Label Caption
  943.     
  944.     If (UNCNode.Child Is Nothing) Then              ' Are There Any Children
  945.         MsgBox "There are no UNC network paths to disconnect.", _
  946.         vbInformation, "Windows UNC Networking"     ' Display Error Message...
  947.         GoTo CleanUp                                ' Clean Up Environment
  948.     End If
  949.     
  950.     Set nChild = UNCNode.Child                      ' Copy First Child
  951.     
  952.     Do While Not (nChild Is Nothing)                ' For Each Available Child
  953.         ' Add Child Description To ListBox
  954.         UNCRemove.lbConnections.AddItem Mid(nChild.Key, (NODEPREFIXLEN + NODEFTPIDXLEN + 1))
  955.         Set nChild = nChild.Next                    ' Point To Next Child
  956.     Loop                                            ' Next Child
  957.     
  958.     UNCRemove.lbConnections.Selected(0) = True      ' Select First Item In The List
  959.     UNCRemove.Show vbModal                          ' Show UNCRemove Form
  960.     
  961.     If (UNCRemove.lbConnections.ListIndex >= 0) Then        ' Is An Item Selected
  962.         For i = 0 To UNCRemove.lbConnections.ListCount - 1  ' Browse For Selected Items
  963.             If UNCRemove.lbConnections.Selected(i) Then     ' Is Item Selected
  964.                 ' Remove Node From TreeView...
  965.                 Call TV.Nodes.Remove(TV.Parent.Tag & ntNWRCHILD & NULLIDX & _
  966.                                      UNCRemove.lbConnections.List(i)) ' Remove Item
  967.             End If
  968.         Next                                        ' Next List Item
  969.     End If
  970. '------------------------------------------------------------
  971. CleanUp:                                            ' Clean Up Environment...
  972. '------------------------------------------------------------
  973.     Unload UNCRemove                                ' Close UNCRemove Form
  974. '------------------------------------------------------------
  975. End Sub
  976. '------------------------------------------------------------
  977.  
  978. '------------------------------------------------------------
  979. Public Sub RemoveFTPConnection(TV As TreeView, NodeX As Node, FTP As Variant)
  980. ' Removes UNC Path From TreeView Control
  981. '------------------------------------------------------------
  982.     Dim i As Integer                                ' Index Pointer
  983.     Dim Inst As Integer                             ' FTP Control Instance
  984.     Dim nChild As Node                              ' Current Child Node
  985. '------------------------------------------------------------
  986.     On Error GoTo CleanUp                           ' Enable Error Handling
  987.     
  988.     Load UNCRemove                                  ' Load UNCRemove Form
  989.     UNCRemove.Caption = "Disconnect FTP Connection" ' Set FTP Connection Title
  990.     UNCRemove.lbList.Caption = "&Connection"        ' Set List Label Caption
  991.     
  992.     If (NodeX.Child Is Nothing) Then                ' Are There Any Children
  993.         MsgBox "There are no FTP connections to disconnect.", _
  994.         vbInformation, "Windows FTP Networking"     ' Display Error Message...
  995.         GoTo CleanUp                                ' Clean Up Environment
  996.     End If
  997.     
  998.     Set nChild = NodeX.Child                        ' Copy First Child
  999.     i = 0                                           ' Init ListBox Index Var.
  1000.     
  1001.     Do While Not (nChild Is Nothing)                ' For Each Available Child
  1002.         ' Add Child Description To ListBox
  1003.         UNCRemove.lbConnections.AddItem nChild.Text, i
  1004.         
  1005.         ' Add FTP Control Instance
  1006.         UNCRemove.lbConnections.ItemData(i) = CLng(Mid(nChild.Key, NODEPREFIXLEN + 1, NODEFTPIDXLEN))
  1007.         
  1008.         i = i + 1                                   ' Increment Index Counter
  1009.         Set nChild = nChild.Next                    ' Point To Next Child
  1010.     Loop                                            ' Next Child
  1011.     
  1012.     UNCRemove.lbConnections.Selected(0) = True      ' Select First Item In The List
  1013.     UNCRemove.Show vbModal                          ' Show UNCRemove Form
  1014.     
  1015.     If (UNCRemove.lbConnections.ListIndex >= 0) Then         ' Is An Item Selected
  1016.         For i = 0 To (UNCRemove.lbConnections.ListCount - 1) ' Browse For Selected Items
  1017.             If UNCRemove.lbConnections.Selected(i) Then      ' Is Item Selected
  1018.                 FTP(UNCRemove.lbConnections.ItemData(i)).Quit ' Disconnect From FTP Server...
  1019.             End If
  1020.         Next                                        ' Next List Item
  1021.     End If
  1022. '------------------------------------------------------------
  1023. CleanUp:                                            ' Clean Up Environment...
  1024. '------------------------------------------------------------
  1025.     Unload UNCRemove                                ' Close UNCRemove Form
  1026. '------------------------------------------------------------
  1027. End Sub
  1028. '------------------------------------------------------------
  1029.  
  1030. '------------------------------------------------------------
  1031. Public Function AddUNCPath(TV As TreeView) As Boolean
  1032. '------------------------------------------------------------
  1033.     Dim UNCPath As String
  1034.     Dim msg As String
  1035.     Dim title As String
  1036.     Dim def As String
  1037.     Dim FormID As String * NODEFORMIDLEN            ' Form ID String Value
  1038. '------------------------------------------------------------
  1039.     AddUNCPath = False                              ' Set Default Return Code
  1040.     On Error Resume Next                            ' Resume If Key Already Exists...
  1041.     
  1042.     FormID = Mid(TV.Nodes(1).Key, 1, NODEFORMIDLEN) ' Extract Form ID From First Tree Node...
  1043.     
  1044.     msg = "Enter The UNC Path That You Want To Connect To..." & vbCrLf & _
  1045.           "[i.e. \\ServerName\ShareName\...path...\]" ' Input Box Body
  1046.     title = App.title & " - Attach To UNC Path"     ' Input Box Title
  1047.     def = "\\Products2\Release"                     ' Input Box Default Value
  1048.     
  1049.     UNCPath = InputBox(msg, title, def)             ' Get UNC Path String...
  1050.     If (UNCPath = "") Then Exit Function            ' User Canceled...
  1051.     
  1052.     Screen.MousePointer = vbHourglass               ' Activate Busy Mouse Pointer
  1053.     ' Validate UNC Path...
  1054.     If (Dir(UNCPath, vbDirectory) = "") Then        ' Is Path Valid Or Available?
  1055.         Screen.MousePointer = vbDefault             ' DeActivate Busy Mouse Pointer
  1056.         MsgBox "UNC network path is invalid or unavailable.", _
  1057.         vbInformation, "Windows UNC Networking"     ' Display Information To User...
  1058.         Exit Function                               ' Error Exit...
  1059.     End If
  1060.             
  1061.     Call TV.Nodes.Add(FormID & ntNETWORK & NULLIDX & NTRNETWORK, tvwChild, _
  1062.                       FormID & ntNWRCHILD & NULLIDX & UNCPath, UNCPath, _
  1063.                       TMYCOMPUTER)                  ' Add Node To Tree...
  1064.     
  1065.     Screen.MousePointer = vbDefault                 ' Reset Mouse Pointer
  1066.     AddUNCPath = True                               ' Return Success
  1067. '------------------------------------------------------------
  1068. End Function
  1069. '------------------------------------------------------------
  1070.  
  1071. '------------------------------------------------------------
  1072. 'Public Function InstanceFTP(FTPArray As Variant, FTPStream As Variant, CallBack() As Integer) As Long
  1073. Public Function InstanceFTP(FTPArray As Variant, CallBack() As Integer) As Long
  1074. '------------------------------------------------------------
  1075.     Dim Ind As Long                                 ' Array Index Var...
  1076. '------------------------------------------------------------
  1077.     InstanceFTP = -1                                ' Set Default Value
  1078.     
  1079.     On Error GoTo InitControl                       ' IF Error Then Control Is Available
  1080.     
  1081.     For Ind = 1 To (FTPArray.Count + 1)             ' For Each Member In FTPArray()
  1082.         If (FTPArray(Ind).Index = Ind) Then         ' If Control Is Not Valid Then..
  1083.         End If                                      ' ..A Runtime Error Will Occure
  1084.     Next                                            ' Search Next Item In Array
  1085. '------------------------------------------------------------
  1086. InitControl:                                        ' Initialize New Control
  1087. '------------------------------------------------------------
  1088.     On Error GoTo ErrorHandler                      ' Enable Error Handling...
  1089.         
  1090.     If (Ind > UBound(CallBack)) Then                ' Expand Array Only...
  1091.         ReDim Preserve CallBack(Ind)                ' Resize CallBack Array
  1092.     End If
  1093.     
  1094.     Load FTPArray(Ind)                              ' Create New Member In FTPArray
  1095.     InstanceFTP = Ind                               ' Return New Ftpct Index
  1096.     Exit Function                                   ' Exit
  1097. '------------------------------------------------------------
  1098. ErrorHandler:                                       ' Handler
  1099. '------------------------------------------------------------
  1100.     Debug.Print Err.Number, Err.Description         ' Debug Errors
  1101.     Resume Next                                     ' Ignore Error And Continue
  1102. '------------------------------------------------------------
  1103. End Function
  1104. '------------------------------------------------------------
  1105.